﻿
/*@ namespace: MyCommerce.Catalog */
/*@ version: 1.beta */
var ProductSchema = {
    Sku: {
        type: new Text({ MaxLength: 30 }),
        searchable: true,
        rules: [new required(), new unique()],

        // realiza a geração de um novo (cria os parâmetros das funções como opcional no C#)
        generate: function (product) {
            
        }
    },
    Name: {
        type: new Text(),
        searchable: true,   // Indica que pode ser pesquisável por uma pesquisa FreeText
        navigable: true,   // Indica que pode ser navegável, irá gerar um indice nas tabelas do banco de dados
        rules: [new required()]
    },
    Description: {
        type: new Text(),
        searchable: true,
        rules: []           // No rules
    },
    Price: {
        type: new Money(),
        rules: [new required(), new range(0.01, Infinity)]
    },

    Visibility: {
        Begin: new Date(),
        End: new Date()
    },

    Brand: {
        type: new BrandSchema(),
        searchable: true,
        navigable: true,
        rules: [new required()]
    },

    Categories: {
        type: new ManyOf(new CategorySchema()),
        navigable: true,
        rules: [new required()]
    },

    Url: {
        type: new Url(),
        rules: [new unique()]
    },

    rules: [
        new AtLeastOneCategory(),
        new {
            DisplayName: '',
            // Retorna somente os dados da entidade que está sendo salva
            validate: function (product) { },
            // Retorna os dados da entidade que está sendo salva e os dados originais
            validate: function (product, original) { },
            // Retorna os dados da entidade que está sendo salva, os dados originais e o contexto de execução
            validate: function (product, original, context) { }
        }
    ],

    // chamado quando o produto é criado pela primeira vez no sistema
    defaults: function (product) {
        product.Sku = this.Sku.generate();
    },

    // chamado de forma síncrona
    onBeforSave: function () {
    },

    // chamado de forma síncrona
    onAfterSave: function () {
    }
}

var ImageSchema = {
    Name: {
        type: new Text()
    },
    Description: {
        type: new Text()
    },
    Content: {
        type: new Binary(),     // StringBase64
        rule: [new required()]
    },
    ContentType: {
        type: new Text(),
        rule: [new required()]
    }
}

var Brand = {
    Name: new Text(),
    Url: new Url(),
    FriendlyUrl: new Url()
}

var Category = {
    DisplayName: new Text(),
    Parent: new Category()
}